<?php

namespace Lite\Utils;

abstract class ArrayUtils {
	
	/**
	 * Retorna un array posicional con los nombres de claves del <code>$array</code>
	 * 
	 * @param array $array
	 * @return array
	 */
	static function getKeyNames(array $array) {
		return array_keys($array);
	}
	
	/**
	 * Retorna el nombre de la primer clave de un array
	 * 
	 * @param array $array
	 * @return mixed
	 */
	static function getFirstKey(array $array){
		return self::getKeyByIndex($array, 0);
	}
	
	/**
	 * Retorna el nombre de la primer clave de un array
	 * 
	 * @param array $array
	 * @return mixed
	 */
	static function getLastKey(array $array){
		return self::getKeyByIndex($array, count($array)-1);
	}
	
	/**
	 * Retorna el valor de una clave de un array
	 * 
	 * @param array $array
	 * @param int $index
	 * @return mixed
	 */
	static function getKeyByIndex(array $array, $index) {
		$keys = self::getKeyNames($array);
		return 0 <= $index && $index < count($keys) ? $keys[$index] : null;
	}
	
	/**
	 * Retorna el valor de la primera posicion del <code>$array</code>
	 * 
	 * @param array $array
	 * @return mixed
	 */
	static function getFirstValue(array $array){
		$key = self::getFirstKey($array);
		return null !== $key ? $array[$key] : null;
	}
	
	/**
	 * Retorna el valor de la ultima posicion del <code>$array</code>
	 * 
	 * @param array $array
	 * @return mixed
	 */
	static function getLastValue(array $array){
		$key = self::getLastKey($array);
		return null !== $key ? $array[$key] : null;
	}
	
	/**
	 * Retorna los valores de un array
	 *  
	 * @param array $array
	 * @return array
	 */
	static function getValues(array $array){
		return array_values($array);
	}
	
	/**
	 * Insertaun elemento al final del array
	 * @param array $array
	 * @param mixed $value
	 * @return array
	 */
	static function insertLast(array & $array, $value) {
		\array_push($array, $value);
		return $array;
	}
	
	/**
	 * Extrae y retorna el ultimo elemento de un array
	 * @param array $array
	 * @return mixed
	 */
	static function removeLast(array & $array) {
		return \array_pop($array);
	}
	
	/**
	 * Inserta un elemento al principio del array
	 * @param array $array
	 * @param mixed $value
	 * @return array
	 */
	static function insertFirst(array & $array, $value) {
		\array_unshift($array, $value);
		return $array;
	}
	
	/**
	 * Extrae y retorna el ultimo elemento de un array
	 * @param array $array
	 * @return mixed
	 */
	static function removeFirst(array & $array) {
		return \array_shift($array);
	}
	
	/**
	 * Retorna una copia de <code>$array</code> sin entradas
	 * 
	 * @param array $array
	 * @return array
	 */
	static function cleanEmpty(array $array) {
		$array = array_filter($array);
		return self::getValues($array);
	}
	
	/**
	 * @param string $glue
	 * @param array $pieces
	 * @return string
	 */
	static function implode(array $pieces, $glue) {
		return \implode($glue, self::cleanEmpty($pieces));
	}
}